/**
 ******************************************************************************
 * @file           : log_cfg.h
 * @brief          : MicroLog configuration file
 * @version        : 1.1.0
 * @date           : 2025-10-18
 ******************************************************************************
 * @attention
 *
 * 本文件包含日志系统的所有配置选项
 * 用户可根据项目需求修改配置
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __LOG_CFG_H__
#define __LOG_CFG_H__

/* Compile-time log level configuration --------------------------------------*/
/**
 * @brief 编译期日志级别
 * @note  低于此级别的日志将不会被编译，可节省 ROM 空间
 *        - Debug 模式建议：LOG_LEVEL_TRACE（编译所有日志）
 *        - Release 模式建议：LOG_LEVEL_INFO（只编译 INFO 及以上）
 */
#ifndef LOG_COMPILE_LEVEL
    #if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)
        #define LOG_COMPILE_LEVEL   LOG_LEVEL_TRACE    /*!< Debug 模式：编译所有级别 */
    #else
        #define LOG_COMPILE_LEVEL   LOG_LEVEL_INFO     /*!< Release 模式：只编译 INFO+ */
    #endif
#endif

/* Feature switches ----------------------------------------------------------*/
/**
 * @brief 时间戳功能
 * @note  1 = 启用时间戳显示（需要 HAL_GetTick）
 *        0 = 禁用时间戳
 */
#ifndef LOG_ENABLE_TIMESTAMP
    #define LOG_ENABLE_TIMESTAMP    1
#endif

/**
 * @brief 函数名输出功能
 * @note  1 = 启用函数名输出（使用 __func__，ROM 开销小）
 *        0 = 禁用函数名输出（节省 ROM）
 */
#ifndef LOG_ENABLE_FUNC
    #define LOG_ENABLE_FUNC         1
#endif

/**
 * @brief 行号输出功能
 * @note  1 = 启用行号输出（使用 __LINE__，ROM 开销极小）
 *        0 = 禁用行号输出
 */
#ifndef LOG_ENABLE_LINE
    #define LOG_ENABLE_LINE         1
#endif

/**
 * @brief 任务信息输出功能
 * @note  1 = 启用任务信息输出（适用于 FreeRTOS 环境）
 *        0 = 禁用任务信息输出（默认，裸机环境）
 */
#ifndef LOG_ENABLE_TASK
    #define LOG_ENABLE_TASK         0
#endif

/**
 * @brief 断言功能
 * @note  1 = 启用断言（Debug 模式推荐，快速失败）
 *        0 = 禁用断言（Release 模式，节省 ROM）
 *        默认：Debug 模式自动启用，Release 模式自动禁用
 */
#ifndef LOG_ENABLE_ASSERT
    #if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)
        #define LOG_ENABLE_ASSERT   1
    #else
        #define LOG_ENABLE_ASSERT   0
    #endif
#endif

/**
 * @brief 输出锁功能（多线程保护）
 * @note  1 = 启用输出锁（FreeRTOS 环境推荐）
 *        0 = 禁用输出锁（裸机单线程环境）
 *        默认：FreeRTOS 环境自动启用
 */
#ifndef LOG_ENABLE_OUTPUT_LOCK
    #ifdef USING_FREERTOS
        #define LOG_ENABLE_OUTPUT_LOCK  1
    #else
        #define LOG_ENABLE_OUTPUT_LOCK  0
    #endif
#endif

/* Buffer configuration ------------------------------------------------------*/
/**
 * @brief 单行日志最大长度
 * @note  包括时间戳、级别、标签和消息内容
 *        - 典型值：256 字节
 *        - 如果 RAM 紧张可减小到 128
 *        - 如果需要长消息可增大到 512
 */
#ifndef LOG_MAX_LINE_LENGTH
    #define LOG_MAX_LINE_LENGTH     256
#endif

/**
 * @brief 模块标签最大长度
 * @note  超过此长度的标签将被截断
 */
#ifndef LOG_MAX_TAG_LENGTH
    #define LOG_MAX_TAG_LENGTH      16
#endif

/**
 * @brief 模块标签过滤器最大数量
 * @note  可同时为多少个模块设置独立日志级别
 *        - 每个过滤器约占用 20 字节 RAM
 *        - 8 个过滤器约占用 160 字节
 */
#ifndef LOG_MAX_TAG_FILTERS
    #define LOG_MAX_TAG_FILTERS     8
#endif

/* Output newline sign -------------------------------------------------------*/
/**
 * @brief 换行符定义
 * @note  根据平台选择：
 *        - Windows: "\r\n"
 *        - Linux/Mac: "\n"
 *        - 嵌入式串口通常使用: "\r\n"
 */
#ifndef LOG_NEWLINE
    #define LOG_NEWLINE             "\r\n"
#endif

/* Configuration validation --------------------------------------------------*/
/**
 * @brief 配置参数范围检查
 * @note  #error: 配置值会导致功能失效，必须修正
 *        #warning: 配置值不合理但不影响功能，建议优化
 */

/* Tag filters validation */
#if LOG_MAX_TAG_FILTERS < 1
    #error "LOG_MAX_TAG_FILTERS must be at least 1"
#endif

#if LOG_MAX_TAG_FILTERS > 32
    #warning "LOG_MAX_TAG_FILTERS is too large, will consume excessive RAM"
#endif

/* Line buffer validation */
#if LOG_MAX_LINE_LENGTH < 64
    #warning "LOG_MAX_LINE_LENGTH is too small, may cause truncated output"
#endif

#if LOG_MAX_LINE_LENGTH > 1024
    #warning "LOG_MAX_LINE_LENGTH is too large, may cause stack overflow"
#endif

/* Tag length validation */
#if LOG_MAX_TAG_LENGTH < 4
    #error "LOG_MAX_TAG_LENGTH must be at least 4"
#endif

#if LOG_MAX_TAG_LENGTH > 32
    #warning "LOG_MAX_TAG_LENGTH is too large, typically 8-16 is sufficient"
#endif

#endif /* __LOG_CFG_H__ */
